home *** CD-ROM | disk | FTP | other *** search
/ BBS Toolkit / BBS Toolkit.iso / wildcat / wc30rec.zip / BTREEL.PAS < prev    next >
Pascal/Delphi Source File  |  1992-05-12  |  7KB  |  307 lines

  1. var
  2.   DebugLockFile  : PathStr;
  3.  
  4.  
  5.   function IsLockOkayPrim(CheckLockError : Boolean) : Boolean;
  6.   const
  7.     MaxRetries = 50;
  8.  
  9.   const
  10.     Retries : Byte = 0;
  11.     CoversBuffer : Pointer = nil;
  12.     CoverAllocated : Boolean = False;
  13.  
  14.   begin
  15.     if not CheckLockError then
  16.       begin
  17.         IsLockOkayPrim := True;
  18.         Retries := 0;
  19.         if CoverAllocated then
  20.           begin
  21.             CoverAllocated := False;
  22.             RestoreWindow(65, 1, 80, 1, True, CoversBuffer);
  23.           end;
  24.       end
  25.     else if Retries < MaxRetries then
  26.       begin
  27.         IsLockOkayPrim := False;
  28.         if CoverAllocated or SaveWindow(65, 1, 80, 1, True, CoversBuffer) then
  29.           begin
  30.             CoverAllocated := True;
  31.             FastWrite('Lock retry #'+Long2Str(Retries), 1, 65, 31);
  32.           end;
  33.         Inc(Retries);
  34.         Delay(500+Random(500));
  35.       end
  36.     else
  37.       LogFatalError('Unable to lock file '+DebugLockFile, IsamError);
  38.   end;
  39.  
  40.  
  41.   function IsFilerOkay : Boolean;
  42.   begin
  43.     IsFilerOkay := IsLockOkayPrim(not IsamOk and (BTIsamErrorClass = 2));
  44.   end;
  45.  
  46.  
  47.   function IsDosOkay(FileResult : Word) : Boolean;
  48.   begin
  49.     IsDosOkay := IsLockOkayPrim(FileResult = 5);
  50.   end;
  51.  
  52.  
  53.   function PackUserName(UserName : Str25) : Str19;
  54.   begin
  55.     PackUserName := Pack6BitKeyUC(UserName, 19);
  56.   end;
  57.  
  58.  
  59.   function PackFileName(Name : Str12) : Str09;
  60.   begin
  61.     PackFileName := Pack6BitKeyUC(Name, 9);
  62.   end;
  63.  
  64.  
  65.   function GetDatabasePtr(Database : WcDatabases) : IsamFileBlockPtr;
  66.   begin
  67.     case Database of
  68.       dbMsg  : GetDatabasePtr := MsgFile;
  69.       dbUser : GetDatabasePtr := UserFile;
  70.       dbFile : GetDatabasePtr := FileSpec;
  71.     end;
  72.   end;
  73.  
  74.  
  75.   function LockBTree(Database : WcDatabases) : Boolean;
  76.   var
  77.     IFBPtr : IsamFileBlockPtr;
  78.  
  79.   begin
  80.     if LockDatabase[Database] then
  81.       begin
  82.         LockBTree := False;
  83.         Exit;
  84.       end;
  85.     case Database of
  86.       dbMsg  : DebugLockFile := 'MSG';
  87.       dbUser : DebugLockFile := 'USER';
  88.       dbFile : DebugLockFile := 'FILE';
  89.     end;
  90.     IFBPtr := GetDatabasePtr(Database);
  91.     repeat
  92.       BtLockFileBlock(IFBPtr);
  93.     until (IsFilerOkay);
  94.     LockDatabase[Database] := True;
  95.     LockBTree := True;
  96.   end;
  97.  
  98.  
  99.   procedure UnLockBtree(Database : WcDatabases);
  100.   var
  101.     IFBPtr : IsamFileBlockPtr;
  102.  
  103.   begin
  104.     if not LockDatabase[Database] then
  105.       Exit;
  106.     IFBPtr := GetDatabasePtr(Database);
  107.     repeat
  108.       BtUnLockFileBlock(IFBPtr);
  109.     until IsFilerOkay;
  110.     LockDatabase[Database] := False;
  111.   end;
  112.  
  113.  
  114.   procedure InitializeBtree;
  115.   var
  116.     PageStackSize : LongInt;
  117.  
  118.   begin
  119.     {$IFDEF Sversion}
  120.     Cfig.Network := NoNet;
  121.     Cfig.Nodeid := 1;
  122.     {$ELSE}
  123.     if MwFlagSet(mwAutoId) then
  124.       if Cfig.NodeId = 0 then
  125.         Cfig.NodeId := GetNextAutoNode
  126.       else if IsAutoNode(Cfig.NodeId) then
  127.         LogFatalError('Node #'+Long2Str(Cfig.NodeId)+' is an autonode id', 0);
  128.     if Cfig.NodeId = 0 then
  129.       LogFatalError('Error getting node id number', 9003);
  130.     {$ENDIF}
  131.     IsamWSNr := Cfig.NodeId;
  132.     PageStackSize := BtInitIsam(Cfig.Network, MinimizeUseOfNormalHeap, 0);
  133.     IsamWSNr := Cfig.NodeId;
  134.     if not IsamOk then
  135.       begin
  136.         WriteLn('Insufficient memory for pagestack ', IsamError);
  137.         Halt;
  138.       end;
  139.     if IsamWSNr > MaxNodes then
  140.       begin
  141.         WriteLn('Invalid node number. Node number out of range.');
  142.         Halt;
  143.       end;
  144.     if not BTSetVariableRecBuffer(512) then
  145.       begin
  146.         WriteLn('Insufficient memory for record buffer ', IsamError, '.');
  147.         Halt;
  148.       end;
  149.   end;
  150.  
  151.  
  152.   function BtreeUsedRecs(IFBPtr : IsamFileBlockPtr) : LongInt;
  153.   begin
  154.     repeat
  155.       BtreeUsedRecs := BtUsedRecs(IFBPtr);
  156.     until IsFilerOkay;
  157.   end;
  158.  
  159.  
  160.   function BtreeUsedKeys(IFBPtr : IsamFileBlockPtr; KeyNr : Integer) : LongInt;
  161.   begin
  162.     repeat
  163.       BtreeUsedKeys := BtUsedKeys(IFBPtr, KeyNr);
  164.     until IsFilerOkay;
  165.   end;
  166.  
  167.  
  168.   procedure ClearBtreeKey(IFBPtr : IsamFileBlockPtr; KeyNr : Integer);
  169.   begin
  170.     repeat
  171.       BtClearKey(IFBPtr, KeyNr);
  172.     until IsFilerOkay;
  173.   end;
  174.  
  175.  
  176.   procedure NextBtreeKey(IFBPtr : IsamFileBlockPtr; var RefNr : LongInt; var Key : IsamKeyStr; KeyNr : Integer);
  177.   begin
  178.     repeat
  179.       BtNextKey(IFBPtr, KeyNr, RefNr, Key);
  180.     until IsFilerOkay;
  181.   end;
  182.  
  183.  
  184.   procedure NextDiffBtreeKey(IFBPtr : IsamFileBlockPtr; KeyNr : Byte; var RefNr : LongInt; var Key : IsamKeyStr);
  185.   begin
  186.     repeat
  187.       BtNextDiffKey(IFBPtr, KeyNr, RefNr, Key);
  188.     until IsFilerOkay;
  189.   end;
  190.  
  191.  
  192.   procedure PrevBtreeKey(IFBPtr : IsamFileBlockPtr; var RefNr : LongInt; var Key : IsamKeyStr; KeyNr : Integer);
  193.   begin
  194.     repeat
  195.       BtPrevKey(IFBPtr, KeyNr, RefNr, Key);
  196.     until IsFilerOkay;
  197.   end;
  198.  
  199.  
  200.   procedure PrevDiffBtreeKey(IFBPtr : IsamFileBlockPtr; KeyNr : Byte; var RefNr : LongInt; var Key : IsamKeyStr);
  201.   begin
  202.     repeat
  203.       BtPrevDiffKey(IFBPtr, KeyNr, RefNr, Key);
  204.     until IsFilerOkay;
  205.   end;
  206.  
  207.  
  208.   procedure FindBtreeKey(IFBPtr : IsamFileBlockPtr; var RefNr : LongInt; Key : IsamKeyStr; KeyNr : Integer);
  209.   begin
  210.     repeat
  211.       BtFindKey(IFBPtr, KeyNr, RefNr, Key);
  212.     until IsFilerOkay;
  213.   end;
  214.  
  215.  
  216.   procedure SearchBtreeKey(IFBPtr : IsamFileBlockPtr; var RefNr : LongInt; var Key : IsamKeyStr; KeyNr : Integer);
  217.   begin
  218.     repeat
  219.       BtSearchKey(IFBPtr, KeyNr, RefNr, Key);
  220.     until IsFilerOkay;
  221.   end;
  222.  
  223.  
  224.   function BtreeFreeRecs(IFBPtr : IsamFileBlockPtr) : LongInt;
  225.   begin
  226.     repeat
  227.       BtreeFreeRecs := BtFreeRecs(IFBPtr);
  228.     until IsFilerOkay;
  229.   end;
  230.  
  231.  
  232.   function BtreeFileLen(IFBPtr : IsamFileBlockPtr) : LongInt;
  233.   begin
  234.     repeat
  235.       BtreeFileLen := BtFileLen(IFBPtr);
  236.     until IsFilerOkay;
  237.   end;
  238.  
  239.  
  240.   procedure GetBtreeVarRec(IFBPtr : IsamFileBlockPtr; RefNr : LongInt; var Data);
  241.   var
  242.     RecSize : Word;
  243.  
  244.   begin
  245.     repeat
  246.       BtGetVariableRec(IFBPtr, RefNr, Data, RecSize);
  247.     until IsFilerOkay;
  248.   end;
  249.  
  250.  
  251.   procedure GetBtreeVarRecPart(IFBPtr : IsamFileBlockPtr; RefNr : LongInt; Size : Word; var Data);
  252.   begin
  253.     repeat
  254.       BtGetVariableRecPart(IFBPtr, RefNr, Data, Size);
  255.     until IsFilerOkay;
  256.   end;
  257.  
  258.  
  259.   procedure GetBtreeRec(IFBPtr : IsamFileBlockPtr; RefNr : LongInt; var Data);
  260.   begin
  261.     repeat
  262.       BtGetRec(IFBPtr, RefNr, Data, False);
  263.     until IsFilerOkay;
  264.   end;
  265.  
  266.  
  267.   procedure OpenBtreeFile(var IFBPtr : IsamFileBlockPtr; FName : IsamFileBlockName);
  268.   begin
  269.     repeat
  270.       BtOpenFileBlock(IFBPtr, FName, False, False, Cfig.DataBaseOpenMode = SaveMode, Cfig.Network <> NoNet);
  271.     until IsFilerOkay;
  272.   end;
  273.  
  274.  
  275.   procedure CloseBtreeFilePrim(var IFBPtr : IsamFileBlockPtr);
  276.   begin
  277.     repeat
  278.       BtCloseFileBlock(IFBPtr);
  279.     until IsFilerOkay;
  280.   end;
  281.  
  282.  
  283.   procedure CloseBtreeFile(Database : WcDatabases);
  284.   begin
  285.     if not OpenDatabase[Database] then
  286.       Exit;
  287.     OpenDatabase[Database] := False;
  288.     case Database of
  289.       dbMsg  : CloseBtreeFilePrim(MsgFile);
  290.       dbUser : CloseBtreeFilePrim(UserFile);
  291.       dbFile : CloseBtreeFilePrim(FileSpec);
  292.     end;
  293.     if not IsamOk then
  294.       LogFatalError('Error closing database', IsamError);
  295.   end;
  296.  
  297.  
  298.   procedure CloseAllFiles;
  299.   var
  300.     Database : WcDatabases;
  301.  
  302.   begin
  303.     for Database := dbMsg to dbFile do
  304.       CloseBtreeFile(Database);
  305.   end;
  306.  
  307.